There are some cases that shadow_write_p2m_entry() is called after
the domain is killed. It causes Xen to crash.
- Race between xc_map_foreign_batch from qemu-dm and "xm destroy"
command.
- The hypervisor calls domain_crash when PoD fails.
Signed-off-by: Kouya Shimura <kouya@jp.fujitsu.com>
ASSERT(paging_mode_translate(d));
+ if ( unlikely(d->is_dying) )
+ {
+ *t = p2m_invalid;
+ return _mfn(INVALID_MFN);
+ }
+
/* XXX This is for compatibility with the old model, where anything not
* XXX marked as RAM was considered to be emulated MMIO space.
* XXX Once we start explicitly registering MMIO regions in the p2m
/* Say we're here, to stop hash-lookups reordering the chains */
ASSERT(shadow_locked_by_me(d));
+ ASSERT(d->arch.paging.shadow.hash_table);
ASSERT(d->arch.paging.shadow.hash_walking == 0);
d->arch.paging.shadow.hash_walking = 1;
shadow_lock(d);
+ if ( unlikely(d->is_dying) )
+ {
+ shadow_unlock(d);
+ return;
+ }
+
/* If we're removing an MFN from the p2m, remove it from the shadows too */
if ( level == 1 )
{